package com.regex;
/**正则表达式 ，又称规则表达式：Regular Expression  简写：regex/regexp/RE
 * 是计算机科学的一个概念，通常被用来检索，替换那些符合某个模式规则的文本，
 * 它不仅限于某一种语言，但是在每种语言中有细微的差别，因为正则表达式的解释引擎有三种，
 * 定义时会有不同*/
/*正则表达式是对 字符串 操的一种逻辑公式，就是用事先定义好的一些字符串，及这些特定的字符组合
* 组成一个“规则字符串“，这个“规则字符串“用来表达对字符串的一种过虑逻辑。使用特殊语法表示字符类，
* 数量限定符和位置关系然后用这些特殊语法和普通字符一起表示一个模式*/
    /*特点：
    * 灵活性、逻辑性和功能性非常强
    * 可以迅速地用简单的方式达到字符串的复杂控制
    * 对于刚接触的人来说，比较晦涩难懂*/
    /*如果以工作中，要定义难的正则表达式，上网找*/

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

/**Java中正则表达式的使用：正则表达式为String类型，被验证的内容同样为String类型
 * 不可以是其它的类型，通过String类中的matches方法实现内容的匹配校验
 * 如：“被验证的内容”.matches("正则表达式")
 * 正则表达式语法规则：[内容限定]{长度限定}
 * 内容限定：如果没有指定长度限定时，那么默认长度为1
 * 单个字符限定：[a]表示当前内容必须是a */
public class RegexText {
    public static void main(String[] args) {
       /* String regex = "[a]";
        String content = "a";*/
       // String regex = "[a-z]";
        //String regex = "[a-zA-Z]";
        //[a-z0-9]:表示内容可以是a-z之间的任意字母或者0-9之间的任意数字，不分先后
        String regex = "[a-zA-Z0-9]";
       // String content = "bcS21"; false 超出长度，默认为1
        String content = "2";
        //String regex = "[^bac]"  //取反，内容不能为a或b或c
       // String content = "b"; false
        System.out.println(content.matches(regex));

        //长度限定：{}
        /*固定长度：{固定长度值}  被匹配的字符串长度必须要和固定长度的值相等  否则false
        * 范围长度：{最小长度值，最大长度值}
        * [a-z]{5}:表示内容范围为小写字母a到z且长度必须为5
        * [a-z]{2,8}:表示内容范围为小写字母a到z且长度在2到8之间，包含2与8
        * [a-z]{2,}:表示内容范围为小写字母a到z且长度最小为2，最大长度无限制
        * [a-z]{0,2}:表示内容范围为小写字母a到z且长度最小为0，最大长度为2*/
        System.out.println("-----------------");
        String regex01 = "[a-z]{0,2}";
       // String content01 = "des"; false 长度为3
        String content01 = "de";
        System.out.println(content01.matches(regex01));

        /*长度限定符号
        * ？：零次或一次，等于{0，1}
        * + ：一次或多次，等于{1，}
        * * ：零次或多次，等同于{0，}*/
        System.out.println("-----------");
        String regex02 = "[^ab]?";
        String content02 = "f";
        //String content02 = "";true
        //String content02 = "fd"; false  超出长度
        System.out.println(content02.matches(regex02));

        /*预定义字符
        * \d    匹配一个数字字符，等价于[0-9]
        * \D    匹配一个数字字符，等价于[^0-9]
        * \n    匹配一个换行符
        * \r    匹配一个回车符
        * \s    匹配任何空白字符，包括空格、制表符、换页等
        * \S    匹配任何空非白字符
        * \t    匹配一个制表符
        * \w    匹配包括下划线的任何单词字符，等价于[a-zA-Z0-9_]
        * \W    匹配非单词字符与下划线，等价于[^a-zA-Z0-9_]*/

        System.out.println("----------------");
        String regex03 = "\\d";//必须加转义字符 \   默认长度为1
        String  content03 = "f";//  \d是数字  false
        String regex04 = "\\d*";
        String content04 = "223333";

        System.out.println(content03.matches(regex03));
        System.out.println(content04.matches(regex04));

        System.out.println("-------------");
        String regex05 = "\\w*";
        String content05 = "sdfdf3233_dsAAA";
        System.out.println(content05.matches(regex05));

        System.out.println("--------------");
        String regex06 = "\\W*";
        String content06 = "sdfdf3233_dsAAA";
        System.out.println(content06.matches(regex06));//false
        String content07 = "中国=+";
        System.out.println(content07.matches(regex06));//true

        /*正则表达式的组合定义：在正则表达式中可心通过多个内容限定与长度来组合定义
        * 例：必须是以字母开头，最少长度为4，最大长度为8  "[a-z]{1}\\w{3,8}"
        * 校验带有区号的电话号码的正则表达式  "\\d{3,4}-\\d{7,8}
        * (\\d{3,4})-(\\d{7,8})    加括号，可读性更强*/
        System.out.println("--------------");
        String regex08 = "[a-z{1}\\w{3,8}]";//给3，因为前面有一位
        String content08 = "s32dPP";
        System.out.println(content08.matches(regex08));
        String regex09 = "(\\d{3,4}-(\\d{7,8}))";
        String content09 = "2312-12345678";
        System.out.println(content09.matches(regex09));

        /*常见的正则表达式  要注意的是 | 代表 或   \\. 代表任意字符  +代表长度{1，}
        * 邮箱： ([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\)+[a-zA-Z]{2,}
        * ip地址：(25[0-5]|2[0-4]\\d[0-1]\\d{2}|[1-9]?\\d
        * URl: http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*
        * 身份证号码：(^\\d{18}$)|(^\\d{15}$)           */
    }
}
